; int prodInterno(short int* v1, char* v2, unsigned int n);

global prodInterno

%define ptr_v1 [ebp + 8]
%define ptr_v2 [ebp + 12]
%define n [ebp + 16]

prodInterno:
	push ebp
	mov ebp, esp
	push esi
	push edi
	push ebx
	
	mov edi, ptr_v1
	mov esi, ptr_v2
	mov ecx, n
	shr ecx, 2 ; Divido el registro ecx por 4. Porque voy a levantar de a 4 elementos.
	pxor mm4, mm4
	
ciclo:
	movq mm0, [edi]
	movd mm1, [esi]
	pxor mm2, mm2 ; Seteo en 0 el registro mm2
	pcmpgtb mm2, mm1 ; Compara los numeros de a byte con signo de mm2 y mm1 (greater).
	punpcklbw mm1, mm2
	movq mm3, mm0 ; Guardo el contenido de mmo para despues multiplicar la parte alta.
	pmullw mm0, mm1 ; Realiza el producto de la parte baja.
	pmulhw mm3, mm1
	movq mm1, mm3
	punpcklwd mm3, mm0
	punpckhwd mm1, mm0
	paddd mm4, mm3
	paddd mm4, mm1
	add edi, 8
	add esi, 4
	loop ciclo
	
	movd eax, mm4
	psrlq mm4, 32
	movd ecx, mm4
	add eax, ecx
	
fin:
	pop ebx
	pop edi
	pop esi
	pop ebp
	ret
